package two.chapter_4.c4_1;

import edu.princeton.cs.algs4.In;
import two.chapter_3.c3_1.ST;
import two.chapter_3.c3_4.HashST;
import two.chapter_3.c3_4.LinearProbingHashST;

public  class SymbolGraph {
    private HashST<String,Integer> st;//保存符号名到索引的映射
    private String[]keys;//保存索引到符号名的映射
    private Graph g;
    /**
     * 根据filename指定的文件构造图，使用separator来分隔顶点名
     * 需要遍历两边文件
     * 一遍是创建符号名和索引的映射，
     * 一遍是构建图
     * @param filename
     * @param separator
     */
    public SymbolGraph(String filename,String separator){
        st=new LinearProbingHashST<>();
        In in=new In(filename);
        while (in.hasNextLine()){
            String []parts=in.readLine().split(separator);
            for (String part:parts){
                if (!st.contains(part))
                    st.put(part,st.size());
            }
        }
        keys=new String[st.size()];
        for (String key:st.keys()){
            keys[st.get(key)]=key;
        }

        //构造图
        g=new AdjGraph(st.size());
        in=new In(filename);
        while (in.hasNextLine()){
            String []parts=in.readLine().split(separator);
            int v=st.get(parts[0]);
            for (int i=1;i<parts.length;i++){
                g.addEdge(v,st.get(parts[i]));
            }
        }
    }

    /**
     * key是一个顶点吗
     * @param key
     * @return
     */
    public  boolean contains(String key){
        return st.contains(key);
    }

    /**
     *key的索引
     * @param key
     * @return
     */
    public  int index(String key){
        return st.get(key);
    }

    /**
     * 索引v的顶点名
     * @param v
     * @return
     */
    public String name(int v) {
        return keys[v];
    }

    public Graph g(){
        return g;
    }
}
